
#include"utility.h"

int writeBit(FILE * fptr,unsigned char bit,unsigned char * whichbit,unsigned char * curbyte){

    // 等于0表示一个新字节
    if(*whichbit == 0){

        *curbyte = 0;
    }
    // bit的值只有 0 和 1 
    // 左移（第一次调用writeBit函数肯定是某个叶子节点） 且 bit == 1 （仅当没有发生位移时）
    unsigned char temp = bit << (7 - *whichbit);
    *curbyte |= temp;
    int value = 0;
    // 因为是先计算curbyte的值再加whichbit的 所以这里等于7也相当于调用了8次
    if(*whichbit == 7){

        int ret = 0;
        ret = fwrite(curbyte,sizeof(unsigned char),1,fptr);
        if(1 == ret){

            value = 1
        }else{

            value = -1;
        }
    }
    (*whichbit) = ((*whichbit) + 1)%8;
    return value;
}

int padZero(FILE * fptr,unsigned char * whichbit,unsigned char * curbyte){

    int rtv = 0;
    // -至少会填充一个curbyte byte
    // *whichbit等于0说明填充的字节是完整的，
    while((*whichbit)!=0){

        rtv = writeBit(fptr,0,whichbit,curbyte);
        if(-1 == rtv){

            return -1;
        }
    }
    return rtv;
}

int readBit(FILE * fptr,unsigned char * bit,unsigned char * whichbit,unsigned char * curbyte){

    int ret = 1;
    // 只有在读取（因为需要消化一个字节）
    if(0 == (*whichbit)){

        // -从文件中读取字节
        ret = fread(curbyte,sizeof(unsigned char),1,fptr);
    }
    if(ret!=1){
        // 读取失败
        return -1;
    }
    // 右移（第一次 whichbit == 0）
    // 只有命令位为1
    // 后面都是将剩下的7位分离开来（将最高位解析出来）
    unsigned char temp = (*curbyte) >> (7 - (*whichbit));
    // 只有当temp == 1 &的结果才为1 所以需要进行8次调用readBit
    temp = temp & 0x01; // 只取一位 忽略其他的

    *whichbit = ((*whichbit) + 1)%8;
    *bit = temp;

    return 1;
}

